package edu.ub.informatica.disseny.movieaff.Vista;


import edu.ub.informatica.disseny.movieaff.Controlador.MovieAffController;
import edu.ub.informatica.disseny.movieaff.Controlador.MovieAffDataManager;
import edu.ub.informatica.disseny.movieaff.modelo.Cliente;
import edu.ub.informatica.disseny.movieaff.modelo.Pelicula;
import java.util.Calendar;
import java.util.Date; 
import java.util.Scanner;

/**
 *
 * @author Usuario
 */
public class MovieAffMain {
    MovieAffController controlador;
    /**
     * @param args the command line arguments
     */
    public MovieAffMain(){
         controlador = new MovieAffController();
         
         
         

    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        MovieAffMain practica1 = new MovieAffMain();
        practica1.gestioMenuPrincipal(sc);
        
        
    }
 

    

   

    static private enum OpcionesMenuPrincipal {Registrarse, Logearse , VerCatalogo , SALIR};

    static private String[] descMenuPrincipal={"Registrarse", "Logearse","Ver Catalogo","Salir"};

    static private enum OpcionesCliente {verPelicula,verCatalogo, introducirPreferencias, 
                                         obtenerRecomendaciones, SALIR};
    static private enum OpcionesAdministrador {BorrarPelicula, generarInforme, 
                                               obtenerRanking,SALIR};

    static private String[] descMenuCliente={"Ver Pelicula",
                                           "Ver Catalogo",
                                           "Introducir Preferencias",
                                           "Obtener Recomendaciones",
                                           "Salir"};
    static private String[] descMenuAdmninistrador={"Borrar Pelicula",
                                                    "Generar Informe",
                                                    "Obtener Ranking",
                                                    "Salir"};

    public void gestioMenuPrincipal(Scanner sc) {

            Menu<OpcionesMenuPrincipal> menu=new Menu("MOVIE AFFINITIES",OpcionesMenuPrincipal.values());

            // Assignem la descripció de les opcions
            menu.setDescripcions(descMenuPrincipal);

            // Obtenim una opció des del menú i fem les accions pertinents
            OpcionesMenuPrincipal opcion = null;
            do {
            // Mostrem les opcions del menú
            menu.mostrarMenu();

            // Demanem una opcio
            opcion=menu.getOpcio(sc);

            // Fem les accions necessàries
            switch(opcion) {
                case Registrarse:
                    mostrarMenuRegistro(sc);
                    
                break;

                case Logearse:
                    mostrarMenuLogin(sc);
                    
                break;

                case VerCatalogo:
                    controlador.mostrarCatalogo();
                    
                break;
                case SALIR:
                    System.out.println("Hasta luego!");
                break;
            }

        } while(opcion!=OpcionesMenuPrincipal.SALIR);

 }
    private void gestionMenuCliente(Scanner sc, Cliente cliente) {
         // Creem l'objecte per al menú. Li passem com a primer paràmetre el nom del menú
        Menu<OpcionesCliente> menu=new Menu("Menu Principal de Cliente",OpcionesCliente.values());

        // Assignem la descripció de les opcions
        menu.setDescripcions(descMenuCliente);

        // Obtenim una opció des del menú i fem les accions pertinents
        OpcionesCliente opcion = null;
        do {
            // Mostrem les opcions del menú
            menu.mostrarMenu();

            // Demanem una opcio
            opcion=menu.getOpcio(sc);

            // Fem les accions necessàries
            switch(opcion) {

                case verPelicula:
                    controlador.mostrarCatalogo();
                    System.out.println("Indica el titulo de la pelicula que quieres visualizar");
                    String titulo = sc.nextLine();
                    Pelicula pelicula;
                    pelicula = controlador.buscarPelicula(titulo);
                    boolean visualizando = cliente.comprobarVisual();
                    if (visualizando){
                        System.out.println("Estás viendo otra pelicula espera a que acabe"
                                         + "para reproducir la siguiente");
                    }
                    else{
                        controlador.reproducir(pelicula);
                        pelicula.sumarVisual();
                        cliente.addPelicula(pelicula);
                        Date fecha = new Date();
                        String data = fecha.toString();
                        cliente.obtenerPelicula(titulo).setFecha(data);
                    
                    }

                break;
                case verCatalogo:
                    controlador.mostrarCatalogo();

                break;
                case introducirPreferencias:
                    controlador.mostrarCatalogo();
                    mostrarMenuIntroducirPreferencias(sc, cliente);

                break;
                case obtenerRecomendaciones:
                    System.out.println("Recomendaciones del sistema");
                    for (int i = 0; i < controlador.obtenCatalogo().tamaño(); i++){
                        if (controlador.obtenCatalogo().getPelicula(i).getGenero().getNom().equals(cliente.getGenero())) {
                            for (int j=0; j<cliente.tamaño();j++) {
                                if (controlador.obtenCatalogo().getPelicula(i).getId().equals(cliente.sacarPelicua(j))) {

                                }
                                else {
                                    System.out.println(controlador.obtenCatalogo().getPelicula(i).getTitle()+ " "+controlador.obtenCatalogo().getPelicula(i).getPromedio());
                                }
                            }
                        }
                    }


                break;
                case SALIR:

                }

        } while(opcion!=OpcionesCliente.SALIR);

 }


    private void gestionMenuAdministrador(Scanner sc) {
          // Creem l'objecte per al menú. Li passem com a primer paràmetre el nom del menú
        Menu<OpcionesAdministrador> menu=new Menu("Menu Principal del Administrador",OpcionesAdministrador.values());

        // Assignem la descripció de les opcions
        menu.setDescripcions(descMenuAdmninistrador);

        // Obtenim una opció des del menú i fem les accions pertinents
        OpcionesAdministrador opcion = null;
        do {
            // Mostrem les opcions del menú
            menu.mostrarMenu();

            // Demanem una opcio
            opcion=menu.getOpcio(sc);

            // Fem les accions necessàries
            switch(opcion) {

                 
                                               
                case BorrarPelicula:
                    controlador.mostrarCatalogo();
                    System.out.println("Introduce el titulo de la pelicula que queires eliminar");
                    String pos = sc.next();
                    System.out.println("¿Quieres eliminar la pelicula? (SI/NO)");
                    String confirma = sc.next();
                    if (confirma.equals("SI")){
                        controlador.obtenCatalogo().borrarPeli(pos);
                        System.out.println("Eliminación correcta");
                    }
                    else if (confirma.equals("NO")){
                        System.out.println("Eliminación no confirmada");
                        
                    }
                    else{
                        System.out.println("Entrada incorrecta");
                    }

                break;
                case generarInforme:
                    Date fecha = new Date();
                    Calendar calendar = Calendar.getInstance();
                    calendar.set(Calendar.MONTH, 0);
                    int mesAnterior = calendar.get(Calendar.MONTH);
                    calendar.set(Calendar.MONTH, 1);
                    int mesActual = calendar.get(Calendar.MONTH);
                    if (mesActual > mesAnterior){
                        controlador.info();
                    }
                    
                break;

                case obtenerRanking:
                    controlador.obtenCatalogo().masValoradas();
                break;
                case SALIR:

                }

        } while(opcion!=OpcionesAdministrador.SALIR);
                    
    }
    
     private void mostrarMenuLogin(Scanner sc) {
        String nom;
        String pass;
        System.out.println("Introduce tu nombre de usuario: ");
        nom = sc.next();
        System.out.println("Introduce tu password: ");
        pass = sc.next();
        int incorrectos;
        System.out.println(nom);
        incorrectos = controlador.comprobarLogin(nom, pass);
        while (incorrectos==0){
            System.out.println("Datos incorrectos!!");
            System.out.println("Vuelve a introducir tu nombre de usuario: ");
            nom = sc.next();
            
            System.out.println("Vuelve a introducir tu password: ");
            pass = sc.next();
            incorrectos = controlador.comprobarLogin(nom, pass);
        }
        if (incorrectos==1) {
            Cliente cliente = controlador.obtenerCliente(nom);
            gestionMenuCliente(sc,cliente);
        }
        if (incorrectos==2) {
            gestionMenuAdministrador(sc);
        }
     }
     
     private void mostrarMenuRegistro(Scanner sc) {
        String nom;
        String dni;
        String adreca;
        String usuari;
        String password;
        String id = "";
        String vip = "";
        String faltes = "";
        String nacionalidad;
        int dia;
        int mes;
        int anyo;
        System.out.println("Introduce tu nombre: ");
        nom = sc.nextLine();
        System.out.println("Introduce tu DNI: ");
        dni = sc.next();
        System.out.println("Introduce tu nacionalidad: ");
        nacionalidad = sc.next();
        System.out.println("Introduce tu fecha de nacimiento (dia, mes y anyo, (dd mm aaaa))");
        dia = sc.nextInt();
        mes = sc.nextInt();
        anyo = sc.nextInt();
        System.out.println("Introduce tu dirección postal: ");
        adreca = sc.next();
        sc.skip("\n");
        System.out.println("Introduce el nombre de usuario que quieres utilizar: ");
        usuari = sc.next();
        System.out.println("Introduce una contraseña secreta: ");
        password = sc.next();
        boolean incorrectos = controlador.comprobarUsuari(usuari);
        while (incorrectos){
            System.out.println("Nombre de usuario no disponible escoge otro diferente: ");
            usuari = sc.next();
            incorrectos = controlador.comprobarUsuari(usuari);
                    
        }
        controlador.crearCliente(id, nom, dni, adreca, usuari, password, vip, faltes);
        
    }
     
     private void mostrarMenuIntroducirPreferencias(Scanner sc, Cliente cliente) {
        System.out.println("¿Qué película quieres valorar? (título):");
        String titulo = sc.next();
        Pelicula pelicula = controlador.buscarPelicula(titulo);
        if (pelicula == null){
            System.out.println("Ninguna película con ese nombre:");
        }
        else{
            String nombreUsu = cliente.getUsuari();
            System.out.println("Introduce tu puntuación (número entre 0 y 5)");
            String puntuacion = sc.next();
            Date fecha = new Date();
            String data = fecha.toString();
            controlador.crearValoracion(null, nombreUsu, titulo, puntuacion, data);
            
        }
    }

    
}
